home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 271_02 / wc.c < prev    next >
Text File  |  1988-01-27  |  4KB  |  154 lines

  1. /*
  2. **                WORD COUNT UTILITY
  3. **
  4. ** syntax:
  5. ** wc [-cwlsv] file
  6. ** -c count only characters
  7. ** -w count only words
  8. ** -l count only lines
  9. ** -s gives only a hex checksum
  10. ** -q silences reporting of filenames
  11. ** file is input file (Do NOT use stdin redirection!)
  12. ** options must be first argument only
  13. ** wildcard filenames are allowed
  14. **
  15. ** ========== COPYRIGHT 1988 BY STEVEN E. MARGISON ==============
  16. ** 1-25-88 A  Turbo-C
  17. **
  18. **   As distributed, this program requires (for compilation):
  19. **     "Steve's Turbo-C Library" version 1.31 or later
  20. **   which may be obtained without registration from many Bulletin
  21. **   Board Systems including:
  22. **      Compuserve IBMSW
  23. **      Cul-De-Sac (Holliston, MA.)
  24. **      GEnie
  25. **   and software library houses including:
  26. **      Public (Software) Library (Houston, TX.)
  27. **
  28. **   or by registration:
  29. **      $10 for Docs, Small Model Library
  30. **      $25 for Docs, C, S, M, L, H libraries, and complete library source
  31. **              in C and Assembler
  32. **     Steven E. Margison
  33. **     124 Sixth Street
  34. **     Downers Grove, IL, 60515
  35. **
  36. **
  37. ** NOTE: expand_args() function is in Version 1.31 or later libraries
  38. **       for Turbo-C version 1.5!
  39. */
  40.  
  41. #include <stdio.h>
  42. #include <ctype.h>
  43. #include <smdefs.h>
  44.  
  45. int binflg, copt, wopt, lopt, sopt, allopt, verbose;
  46. FILE *fd;
  47. int nargc;
  48.  
  49. main(argc, argv)
  50. int argc;
  51. char *argv[];
  52. {
  53.    char *cksum, *nc, *nl, *nw;
  54.    int index, c, inword, argci;
  55.  
  56.    if(argc < 2) usage();
  57.  
  58.    nargc = expand_args(argc, argv);  /* expand wildcards */
  59.    if(nargc is 0) error("Error in command line expansion");
  60.  
  61.    verbose = YES;
  62.    sopt = lopt = wopt = copt = FALSE;
  63.    allopt=TRUE;
  64.    argci = 1;
  65.  
  66.    if(nargv[argci][0] is '-') {
  67.       index = 0;
  68.       while(nargv[argci][++index] isnot NULL) {
  69.          switch(tolower(nargv[argci][index])) {
  70.             case 'q':
  71.                verbose = NO;
  72.                break;
  73.             case 'c':
  74.                copt = TRUE;
  75.                allopt = FALSE;
  76.                break;
  77.             case 'w':
  78.                wopt = TRUE;
  79.                allopt = FALSE;
  80.                break;
  81.             case 'l':
  82.                lopt = TRUE;
  83.                allopt = FALSE;
  84.                break;
  85.             case 's':
  86.                sopt = TRUE;
  87.                allopt = FALSE;
  88.                break;
  89.             default:
  90.                usage();
  91.          } /* end of switch */
  92.       } /* end of while */
  93.    argci++;    /* get around options */
  94.    } /* end of option "if" */
  95.  
  96.    while(argci < nargc) {
  97.       cksum = nc = nl = nw = 0;
  98.       inword = NO;
  99.       if(nargv[argci][0] is '-') usage();
  100.  
  101.       do_open(nargv[argci++]);
  102.  
  103.       while((c = fgetc(fd)) isnot EOF) {
  104.          cksum += c;
  105.          if(binflg) continue;
  106.          if(c is '\n') {
  107.             ++nl;
  108.             ++nc;
  109.             ++nc;     /* because a newline is actually two characters */
  110.             inword = NO;
  111.          }
  112.          else ++nc;
  113.          if(isspace(c)) inword = NO;
  114.          else if(inword is NO) {
  115.             inword = YES;
  116.             ++nw;
  117.             }
  118.          }  /* end of inner while */
  119.       if(allopt and !binflg)
  120.          printf("%6d characters  %d words  %d lines  %6x checksum\n",
  121.             nc, nw, nl, cksum);
  122.       if(binflg) printf("%x checksum\n", cksum);
  123.  
  124.       if(copt) printf("%d\n", nc);
  125.       if(wopt) printf("%d\n", nw);
  126.       if(lopt) printf("%d\n", nl);
  127.       if(sopt) printf("%x\n", cksum);
  128.       fclose(fd);
  129.    } /* end of file loop */
  130. }
  131.  
  132. usage() {
  133. fputs("WC Version 1.50 1-25-87  Copyright 1987 S.E. Margison\n", stderr);
  134. error("usage: wc [-cwlsq] <file1, file2, filen>");
  135. }
  136.  
  137. do_open(string) char *string; {
  138.    binflg = NO;
  139.    if(exttyp(string, "OBJ") is YES) { binflg = YES; goto AA; }
  140.    if(exttyp(string, "EXE") is YES) { binflg = YES; goto AA; }
  141.    if(exttyp(string, "COM") is YES) { binflg = YES; goto AA; }
  142.    if(exttyp(string, "ARC") is YES) { binflg = YES; goto AA; }
  143.    if(exttyp(string, "LIB") is YES) binflg = YES;
  144.    AA:
  145.    if(!binflg) {
  146.       if((fd = fopen(string, "r")) is NULL) cant(string);
  147.       }
  148.    else {
  149.       if((fd = fopen(string, "rb")) is NULL) cant(string);
  150.       }
  151.    if(verbose) printf("File: %s\n", string);
  152.    }
  153.  
  154.